// base.h
#ifndef BASE_H
#define BASE_H

#include "goboard.h"
#include "gotypes.h"

/**
 * @brief Abstract base class for agents.
 * 
 * Agents must implement the select_move method to choose a move based on the game state.
 */
class Agent {
public:
    int num_rounds;      ///< Number of MCTS iterations
    double temperature;  ///< Exploration parameter for UCT

    /**
     * @brief Constructor for the Agent class.
     * 
     * @param num_rounds_ Number of iterations for MCTS.
     * @param temperature_ Exploration parameter for UCT.
     */
    Agent(int num_rounds_, double temperature_) 
        : num_rounds(num_rounds_), temperature(temperature_) {}

    /**
     * @brief Virtual destructor.
     */
    virtual ~Agent() {}

    /**
     * @brief Pure virtual function to select a move based on the current game state.
     * 
     * @param game_state Current state of the game.
     * @return Move Selected move.
     */
    virtual Move select_move(const GameState& game_state) = 0;
};

#endif // BASE_H
